import os

#传入数字 返回带单位的数字
def numb(filesize):
    if len(str(filesize)) < 4:
        filesize = '{}{}'.format(float('%.2f' % float(filesize)), 'b')
    elif len(str(filesize)) >= 4 and len(str(filesize)) < 7:
        filesize = '{}{}'.format(float('%.2f' % float(filesize / 1024)), 'kb')
    elif len(str(filesize)) >= 7 and len(str(filesize)) < 10:
        filesize = '{}{}'.format(float('%.2f' % float(filesize / 1024 / 1024)), 'mb')
    else:
        filesize = '{}{}'.format(float('%.2f' % float(filesize / 1024 / 1024 / 1024)), 'gb')
    return (filesize)

#获取指定格式 目录字典
def findpath(filepath,basedict={}):
    # 初始化一个默认列表 保存当前目录下的文件名称
    basedict['files'] = []
    for i in os.listdir(filepath):
        if os.path.isdir(os.path.join(filepath, i)):
            # 若当前文件为列表 则递归创建一个字典元素重新记录文件
            basedict[i] = {}
            findpath(os.path.join(filepath, i), basedict[i])
        else:
            basedict['files'].append(i)
    return (basedict)

#打印目录文件与大小
def pEffect(filepath, dst):
    #初始刷文件夹字符串 0元素为路径 1为文件夹大小
    filepath = [filepath,0]
    print(filepath[0])

    for i in dst['files']:
        # 补全路径 计算大小
        file_size = os.path.getsize(os.path.join(filepath[0],i))
        #将文件的大小 累积添加到当前目录的大小中
        filepath[1] += file_size
        # 特定格式输出
        print('├', end='─')
        print(i, numb(file_size))

    #删除掉字典中的files元素 这是字典中每个元素的就是一个目录
    dst.pop('files')

    #递归目录
    for k, v in dst.items():
        k = k +'/'
        #将子目录的大小累加到父目录
        filepath[1] += pEffect(os.path.join(filepath[0], k), v)
    print(filepath[0],numb(filepath[1]))
    return(filepath[1])

if __name__ == '__main__':
    file_path = r'D:/shell/'
    aa = findpath(file_path)
    pEffect(file_path,aa)